home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr49 / 274_01.zip / A_FILL.H < prev    next >
Text File  |  1993-04-01  |  5KB  |  153 lines

  1. /* Array Handling Package
  2. (C) Copyright 1985,1987,1988 James P. Cruse - All Rights Reserved
  3.  
  4. a_fill.h  
  5.  
  6. A Part of the User-Supported Array Handling package. Please see
  7. the file ARRAY.h for discussion concerning the registration and 
  8. usage of the package.
  9.  
  10. declares all the various fill operations
  11.  
  12. Notation:
  13.     d[]    =>    all elements of d (from 0 to n-1)
  14.     d[i]    =>    the i'th element of d (from 0 to n-1)
  15.     d[i-1]    =>    the i-1'th element of d (from 1 to n-1)
  16.     s    =>    parameter s
  17.     f()    =>    function parameter f (i.e. cos)
  18.     T    =>    function type T (i.e. float)
  19.  
  20. The functions are: 
  21.     a_index(n,d)    d[i] = i        index
  22.     a_indoff(n,d,o)    d[i] = o + i        index + offset
  23.     a_assign(n,d,c)    d[] = c            assign constant to d[]
  24.     a_i_scale(n,d,s,o)            scale with index
  25.             d[i] = o + i*s        linear poly on index
  26.     a_fill(n,d,b,e)    d[i] = b + i*((e-b)/n)    exclusive fill
  27.                 d[0] = b, d[n] would be e
  28.     a_ifill(n,d,b,e) d[i] = b + i*((e-b)/(n-1) inclusive fill
  29.                 d[0] = b, d[n-1] = e
  30.     a_t_fill(n,d,b,e,T)            typed exclusive fill
  31.             d[i] = b + (T)i*(((T)(e-b))/(n))
  32.     a_t_ifill(n,d,b,e,T)            typed inclusive fill
  33.             d[i] = b + (T)i*(((T)(e-b))/(n-1))
  34.     a_f_fun(n,d,f()) d[] = f()        fill with return of function
  35.     a_i_fun(n,d,f()) d[i] = f(i)        function fill with index parm
  36.     a_t_i_fun(n,d,f(),T) d[i] = f( (T)i )    typed function fill, type index
  37.  
  38.  
  39. Note:
  40.     the various fill behave somewhat non-intuitivally due to using
  41.     integers as index. The following examples should clear up the 
  42.     differences. f is a float destination array, i is the index, b = 1,
  43.     and e = 10
  44.                            f(x)
  45. call:        rval:i=>   0    1    3      5        8          9
  46.  
  47. a_fill(10,f,0,10)    => 0  1.000000  3.000000  5.000000  8.000000  9
  48. a_ifill(10,f,0,10)    => 0  1.000000  3.000000  5.000000  8.000000  10
  49. a_t_fill(10,f,0,10,float)  0  1.000000  3.000000  5.000000  8.000000  9
  50. a_t_ifill(10,f,0,10,float) 0  1.111111  3.333333  5.555555  8.888889  10
  51. a_fill(10,f,0.0,10.0)       0  1.000000  3.000000  5.000000  8.000000  9
  52. a_ifill(10,f,0.0,10.0)       0  1.111111  3.333333  5.555555  8.888889  10
  53.  
  54. What this all means is two things: 
  55. 1> if you do not type the fill to a float or use a float b or e parameter, 
  56. the numbers you get back may not be what you expect. 
  57. 2> The difference between fill and ifill is whether or not the last 
  58. index is going to be exactly the end point or not:
  59.     d[n-1] = b + (n-1)*(e-b)/(n-1)     => e         in ifill
  60.     d[n-1] = b + (n-1)*(e-b)/n     => e - (e-b)/n     in fill.
  61.  
  62. */    
  63.  
  64. /* check to make sure array.h has been included */
  65. #ifndef    ARR_IF_NEEDED
  66. #include "array.h"
  67. #endif
  68.  
  69.  
  70.  
  71. /* check to see if we have been loaded */
  72. #ifndef    ARR_FILL_LOADED
  73. #define    ARR_FILL_LOADED    1
  74.  
  75. /* index */
  76. #define    a_index(N,D)    ARR_IF1 { \
  77.     ARR_TYPE_IND ARR_IND = (N);  \
  78.     while (ARR_IND--) \
  79.         (D)[ARR_IND] = ARR_IND; \
  80.     }  ARR_IF2
  81.  
  82. /* index + offset */
  83. #define    a_indoff(N,D,O)    ARR_IF1 { \
  84.     ARR_TYPE_IND ARR_IND = (N);  \
  85.     while (ARR_IND--) \
  86.         (D)[ARR_IND] = ARR_IND + (O); \
  87.     }  ARR_IF2
  88.  
  89. /* fill, exclusive */
  90. #define    a_fill(N,D,B,E)    ARR_IF1 { \
  91.     ARR_TYPE_IND ARR_IND = (N);  \
  92.     while (ARR_IND--) \
  93.         (D)[ARR_IND] = (B) + ( (ARR_IND * ((E)-(B)) ) / (N) ); \
  94.     }  ARR_IF2
  95.  
  96. /* fill, inclusive */
  97. #define    a_ifill(N,D,B,E)    ARR_IF1 { \
  98.     ARR_TYPE_IND ARR_IND = (N); \
  99.     while (ARR_IND--) \
  100.         (D)[ARR_IND] = (B) + ( (ARR_IND * ((E)-(B)) ) / (N-1) ); \
  101.     } ARR_IF2
  102.  
  103. /* typed fill, exclusive */
  104. #define    a_t_fill(N,D,B,E,T)    ARR_IF1 { \
  105.     ARR_TYPE_IND ARR_IND = (N); \
  106.     while (ARR_IND--) \
  107.      (D)[ARR_IND] = (T) ( (B) + ( (ARR_IND * ((T) ((E)-(B))) ) / (N) ) ); \
  108.     } ARR_IF2
  109.  
  110. /* typed fill, inclusive */
  111. #define    a_t_ifill(N,D,B,E,T)    ARR_IF1 { \
  112.     ARR_TYPE_IND ARR_IND = (N); \
  113.     while (ARR_IND--) \
  114.      (D)[ARR_IND] = (T)((B) + ( (ARR_IND * ((T) ((E)-(B))) ) / (N-1) ) ); \
  115.     } ARR_IF2
  116.  
  117. /* assign */
  118. #define    a_assign(N,D,C)    ARR_IF1 { \
  119.     ARR_TYPE_IND ARR_IND = (N);  \
  120.     while (ARR_IND--) \
  121.         (D)[ARR_IND] = (C); \
  122.     }  ARR_IF2
  123.  
  124. /* scale & offset */
  125. #define    a_i_scale(N,D,S,O)    ARR_IF1 { \
  126.     ARR_TYPE_IND ARR_IND = (N); \
  127.     while (ARR_IND--) \
  128.         (D)[ARR_IND] = (S)*ARR_IND + (O); \
  129.     } ARR_IF2
  130.  
  131. /* function */
  132. #define    a_f_fun(N,D,F)    ARR_IF1 { \
  133.     ARR_TYPE_IND ARR_IND = (N); \
  134.     while (ARR_IND--) \
  135.         (D)[ARR_IND] = F(); \
  136.     } ARR_IF2
  137.  
  138. /* index function */
  139. #define    a_i_fun(N,D,F)    ARR_IF1 { \
  140.     ARR_TYPE_IND ARR_IND = (N); \
  141.     while (ARR_IND--) \
  142.         (D)[ARR_IND] = F(ARR_IND); \
  143.     } ARR_IF2
  144.  
  145. /* typed index function */
  146. #define    a_t_i_fun(N,D,F,T)    ARR_IF1 { \
  147.     ARR_TYPE_IND ARR_IND = (N); \
  148.     while (ARR_IND--) \
  149.         (D)[ARR_IND] = F((T)ARR_IND); \
  150.     } ARR_IF2
  151.  
  152. #endif
  153.